
昨天千辛萬苦 (只有我) 的把 ESLiint 處理好了,
但是 ESLint 有個問題,他沒在管 style 的 (所以我才會有機會受到 Prettier 的荼毒)
所以我們今天來幫 style 找個小精靈吧~
yarn add stylelint stylelint-config-standard-scss stylelint-config-standard-vue stylelint-order postcss postcss-html postcss-scss -D
裝完會出現這些:
{
  "postcss": "^8.4.41",
  "postcss-html": "^1.7.0",
  "postcss-scss": "^4.0.9",
  "stylelint": "^16.8.1",
  "stylelint-config-standard-scss": "^13.1.0",
  "stylelint-config-standard-vue": "^1.0.0",
  "stylelint-order": "^6.0.4",
}
沒錯看到安裝的程式碼,我們今天就是要來用 stylelint 啦,
為什麼是 stylelint 呢?
unopinionated(非强制约束),可以根據需求自訂規則約束力度。那裝上面一堆有的沒的是做什麼的?
postcss 系列,由於 stylelint 會需要動 CSS 程式碼,所以要依賴一下。stylelint-config-standard-scss 讓 stylelint 更好的檢查 SCSS 。stylelint-config-standard-vue 讓 stylelint 可以檢查 vue SFC 的 <style> 區塊 。stylelint-order 依照你的規則,排序 CSS 屬性,含自動修復排序功能。在根目錄下面新增兩個檔案 .stylelintrc.mjs、.stylelintignore
.stylelintrc.mjs
/** @type {import('stylelint').Config} */
export default {
    extends: [
        'stylelint-config-standard-scss',
        'stylelint-config-standard-vue/scss'
    ],
    plugins: [
        'stylelint-order'
    ],
    rules: {
        'order/order': [
            'custom-properties',
            'declarations'
        ],
        'order/properties-order': [ // 可自訂,請參考 order/properties-order 排序
            省略...
        ],
        'at-rule-no-unknown': null, // 允許未知的 at 規則。
        'rule-empty-line-before': null, // 規則之前必須始終有一個空行。
        'block-no-empty': true, // 不允許空塊。
        'comment-no-empty': true, // 不允許空註解。
        'length-zero-no-unit': true, // 不允許使用零長度的單位(可自動修復)。
        'declaration-block-single-line-max-declarations': 1, // 單行 CSS block 的最參數數量。
        'at-rule-empty-line-before': 'never', // at(@) 規則之前必須始終有一個空行。
        // 'selector-class-pattern': '^[a-z][a-zA-Z0-9]+$', // 類選擇器的命名模式。
        'selector-class-pattern': null, // 類選擇器的命名模式。
        'property-no-vendor-prefix': null, // 禁止屬性的供應商前綴。
        'value-no-vendor-prefix': null, // 禁止值的供應商前綴。
        'selector-attribute-quotes': 'never', // 不用給屬性選擇器的引號。
        'declaration-empty-line-before': 'never', // 在屬性之前不允許空行。
        'color-function-notation': null, // 不限制色彩函數的表示法。
        'scss/at-mixin-argumentless-call-parentheses': 'always', // 在 mixin 調用時,要求省略空參數的括號。
        'scss/at-mixin-pattern': null, // mixin 的命名模式。
        'scss/dollar-variable-pattern': null, // 變數的命名模式。
        'scss/percent-placeholder-pattern': null, // 繼承型變數的命名模式。
        'value-keyword-case': null, // 屬性值的大小寫。
        'no-descending-specificity': null // 低權重選擇器無法宣告在高權重選擇器之後。(檢測邏輯不夠完善 不開啟)
    },
    overrides: [
        {
            files: ['*.vue', '**/*.vue']
        }
    ],
    ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts', '**/*.json', 'node_modules/', 'docs/.vitrepress/cache/', 'docs/.vitrepress/dist/']
};
.stylelintignore
/node_modules/**
/docs/public/**
/docs/.vitepress/cache/**
/docs/.vitepress/dist/**
安裝完之後,在 settings.json 加入下面的設定:
{
    // Auto fix
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": "explicit",
        "source.fixAll.stylelint": "explicit", // [!code ++]
        "source.organizeImports": "never"
    },
    "stylelint.config": null, // 使用 stylelint 的設定檔  // [!code ++]
    "stylelint.enable": true, // 啟用 stylelint  // [!code ++]
    "stylelint.validate": [  // [!code ++]
        "postcss",  // [!code ++]
        "css",  // [!code ++]
        "scss",  // [!code ++]
        "vue",  // [!code ++]
        "html",  // [!code ++]
  ],  // [!code ++]
}
最後重啟專案就完成啦~
當然設定 stylelint 的過程也是充滿了問題,
和 ESLlint 不太一樣,這邊主要是 套件要安裝那些各種混亂,
最多的時候裝了 14 個相依套件 = =,而且還是失敗的狀態,
甚至還有說 stylelint 對 vue 的支援有問題,要退大版本才可以......
一度差點放棄,最後搞半天才有了現在的成果,
在這邊特別感謝 Claire 大大的文章 ,讓我脫離農場文陷阱。
真的要多嘗試,不要太相信一些農場文的唬爛= =。
如果對 Opshell 的 CSS 排序規則有興趣的話,請到部落格服用。